﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.ModelBinding;
using Kakaroto.Models;

namespace Kakaroto.Caixa
{
    public partial class Checkout : System.Web.UI.Page
    {
        static string prevPage = String.Empty;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                prevPage = Request.UrlReferrer.ToString();
            }

            calculaTotal();
            
            Pedido pedido = GetPedido();
            if (pedido != null)
            {
                string heading = pedido.Id_Mesa.ToString(); ;
                if (!string.IsNullOrEmpty(pedido.Cliente_Nome))
                {
                    heading += " | " + pedido.Cliente_Nome;
                }

                lblMesa.Text = heading;
                lblSubTotal.Text = String.Format("{0:0.##}", pedido.Total);
                lblTotal.Text = String.Format("{0:0.##}", pedido.Total + (pedido.Total * pedido.Servico / 100) - (pedido.Total * pedido.Desconto / 100));
                lblTroco.Text = HttpContext.Current.Session["Troco"].ToString();
            }
            Servico.Focus();
        }

        public Pedido GetPedido()
        {
            return HttpContext.Current.Session["Cx_Pedido"] as Pedido;
        }

        protected void CancelBtn_Click(object sender, EventArgs e)
        {
            Response.Redirect(prevPage);
        }

        protected void CheckoutBtn_Click(object sender, EventArgs e)
        {
            UpdatePedidoBtn_Click(sender, e);
            if (!lblTroco.Text.Equals("Quantia insuficiente")
               && !lblTroco.Text.Equals("Quantia não informada..."))
            {
                Pedido pedido = GetPedido();
                pedido.Status_Pagamento = true;
                pedido.Tipo_Pagamento = Tipo_Pagamento.SelectedValue;
                pedido.Saida = DateTime.Now;
                pedido.Total = pedido.Total 
                             + (pedido.Total * pedido.Servico / 100) 
                             - (pedido.Total * pedido.Desconto / 100);

                HttpContext.Current.Session["Cx_Pedido"] = pedido;
                HttpContext.Current.Session["Quantia"] = Quantia_Recebida.Text;
                HttpContext.Current.Session["Troco"] = lblTroco.Text;
                Response.Redirect("./Nota.aspx?subTotal=" + lblSubTotal.Text);
            }
        }

        protected void UpdatePedidoBtn_Click(object sender, EventArgs e)
        {
            Pedido pedido = GetPedido();
            string serv = Servico.Text;
            if (!string.IsNullOrEmpty(serv))
            {
                int serv_i = Convert.ToInt32(serv);
                if (serv_i < 0){
                    pedido.Servico = 10;
                    Servico.Text = null;
                }
                else pedido.Servico = serv_i;
            }
            else pedido.Servico = 10;

            string desc = Desconto.Text;
            if (!string.IsNullOrEmpty(desc))
            {
                int desc_i = Convert.ToInt32(desc);
                if (desc_i < 0){
                    pedido.Desconto = 0;
                    Desconto.Text = null;
                }
                else pedido.Desconto = desc_i;
            }
            else pedido.Desconto = 0;
            
            HttpContext.Current.Session["Cx_Pedido"] = pedido;
            
            calculaTotal();

            string recebido = Quantia_Recebida.Text;
            if (!string.IsNullOrEmpty(recebido))
            {
                double? troco = calculaTroco(recebido);
                if (troco < 0.0)
                {
                    lblTroco.Font.Bold = true;
                    lblTroco.ForeColor = System.Drawing.Color.Red;
                    lblTroco.Text = "Quantia insuficiente";
                }
                else
                {
                    lblTroco.Font.Bold = false; 
                    lblTroco.ForeColor = System.Drawing.Color.Black;
                    lblTroco.Text = String.Format("{0:0.##}" , troco);
                }
            }
        }

        protected double? calculaTroco(string recebido)
        {
            Pedido pedido = GetPedido();
            string total = (pedido.Total
                            + (pedido.Total * pedido.Servico / 100)
                            - (pedido.Total * pedido.Desconto / 100)).ToString();

            double? tt = Convert.ToDouble(total);
            double? qr = Convert.ToDouble(recebido);
            return (qr - tt);
        }

        protected void calculaTotal()
        {
            Pedido pedido = GetPedido();
            if (pedido != null)
            {
                lblTotal.Text = String.Format("{0:0.##}", pedido.Total + (pedido.Total * pedido.Servico / 100) - (pedido.Total * pedido.Desconto / 100));
                lblServico.Text = String.Format("{0:0.##}", pedido.Total * pedido.Servico / 100);
                lblDesconto.Text = String.Format("{0:0.##}", pedido.Total * pedido.Desconto / 100);
            }
        }
    }
}